﻿using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOPresupuestoRepuesto
    /// </summary>
    class DAOIMPLPresupuestoRepuesto:Presupuesto_DAO.DAOPresupuestoRepuesto
    {
        /// <summary>
        /// Guarda un presupuesto con los repuestos asociados
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idRepuesto">Determina el repuesto</param>
        /// <param name="cantidad">Cantidad del repuesto</param>
        /// <param name="precio_unitario">Precio de cada repuesto</param>
        /// <param name="precio_total">Precio total de los repuestos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoRepuesto(int idPresupuesto, int idRepuesto, int cantidad, Double precio_unitario, Double precio_total)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO presupuesto_repuesto(id_presupuesto, id_repuesto, cantidad, precio_unitario, precio_total) VALUES(@idPresupuesto, @idRepuesto, @cantidad, @precioUnitario, @precioTotal)";
                insertar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                insertar.Parameters.AddWithValue("@idRepuesto", idRepuesto);
                insertar.Parameters.AddWithValue("@cantidad", cantidad);
                insertar.Parameters.AddWithValue("@precioUnitario", precio_unitario);
                insertar.Parameters.AddWithValue("@precioTotal", precio_total);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un presupuesto con repuestos asociados
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto</param>
        /// <param name="idRepuesto">Determina el repuesto</param>
        /// <param name="cantidad">Cantidad del repuesto</param>
        /// <param name="precio_unitario">Precio de cada repuesto</param>
        /// <param name="precio_total">Precio total de los repuestos</param>
        /// <param name="id">Determina la relación a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoRepuesto(int idPresupuesto, int idRepuesto, int cantidad, double precio_unitario, double precio_total, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE presupuesto_repuesto SET id_presupuesto = @idPresupuesto, id_repuesto = @idRepuesto , cantidad = @cantidad, precio_unitario = @precioUnitario, precio_total = @precioTotal WHERE id_presupuesto = @id";
                modificar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                modificar.Parameters.AddWithValue("@idRepuesto", idRepuesto);
                modificar.Parameters.AddWithValue("@cantidad", cantidad);
                modificar.Parameters.AddWithValue("@precioUnitario", precio_unitario);
                modificar.Parameters.AddWithValue("@precioTotal", precio_total);
                modificar.Parameters.AddWithValue("@id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un prepuesto y sus repuestos
        /// </summary>
        /// <param name="idPresupuesto">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoCliente(int idPresupuesto)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "DELETE FROM presupuesto_repuesto WHERE id_presupuesto = @idPresupuesto";
                eliminar.Parameters.AddWithValue("@idPresupuesto", idPresupuesto);
                eliminar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos de repuestos
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuestoRepuesto()
        {
            DataTable presupuestos_repuesto = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();

            try
            {
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT p.codigo, r.Codigo, r.Descripcion, SUM(pr.cantidad) as cantidad, pr.precio_unitario, SUM(pr.precio_total) as total FROM presupuesto_repuesto pr "
                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id INNER JOIN repuestos r ON pr.id_repuesto = r.id WHERE p.activo = true "
                    + "GROUP BY p.codigo, r.codigo";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(presupuestos_repuesto);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                presupuestos_repuesto = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return presupuestos_repuesto;
        }

        /// <summary>
        /// Obtiene un presupuesto de repuestos
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoRepuesto</returns>
        public presupuestoRepuesto getPresupuestoRepuesto(string codigoPresupuesto)
        {
            presupuestoRepuesto presupuesto_repuesto = new presupuestoRepuesto();
            MySqlConnection conexion = Conexion.conexionMySQL();
            List<string> codigo = new List<string>();
            List<string> descripcion = new List<string>();
            List<int> cantidad = new List<int>();
            List<double> preU = new List<double>();
            List<double> preT = new List<double>();

            try
            {
                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT p.codigo, r.Codigo, r.Descripcion, pr.cantidad, pr.precio_unitario, pr.precio_total FROM presupuesto_repuesto pr "
                    + "INNER JOIN presupuestos p ON pr.id_presupuesto = p.id INNER JOIN repuestos r ON pr.id_repuesto = r.id "
                    + "WHERE p.codigo = @codigoPresupuesto";

                consulta.Parameters.AddWithValue("@codigoPresupuesto", codigoPresupuesto);
                MySqlDataReader lector = consulta.ExecuteReader();
                presupuesto_repuesto.CodigoPresupuesto = codigoPresupuesto;

                while (lector.Read())
                {

                    cantidad.Add(Convert.ToInt16(lector["cantidad"].ToString()));
                    codigo.Add(lector["Codigo"].ToString());
                    descripcion.Add(lector["Descripcion"].ToString());
                    preT.Add(Convert.ToDouble(lector["precio_total"].ToString()));
                    preU.Add(Convert.ToDouble(lector["precio_total"].ToString()));
                }
                presupuesto_repuesto.Cantidad = cantidad;
                presupuesto_repuesto.CodigoRepuesto = codigo;
                presupuesto_repuesto.DescripcionRepuesto = descripcion;
                presupuesto_repuesto.PrecioTotal = preT;
                presupuesto_repuesto.PrecioUnitario = preU;

                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                presupuesto_repuesto = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return presupuesto_repuesto;
        }
    }
}
